
#include "Princesa.h"
#include <iostream>
#include <algorithm>

const int EstadoPrincesa::Rescatando = 0;
const int EstadoPrincesa::FinRescate = 1;
const int EstadoPrincesa::SinParticular = 2;
const vector<int> EstadoPrincesa::accionesParticulares = make_vector<int>() << EstadoPrincesa::Rescatando;
const vector<string> EstadoPrincesa::descripcionAccionesParticulares = make_vector<string>() << "rescatar";

Princesa::Princesa(int x, int y, int maximoX, int maximoY, Orientacion orientacion) : ObjetoEstatico(x, y, maximoX, maximoY, orientacion) {

	estadoParticular = EstadoPrincesa::SinParticular;
	salvador = NULL;
	
	tipo = PRINCESA;
}

pair<idImagen_t, int> Princesa::getDibujable(Uint32 time) {
	
	
	pair<idImagen_t, int> dibujable;
	
	if (estadoParticular == EstadoPrincesa::SinParticular) {
		dibujable = ObjetoEstatico::getDibujable(time);
	}
	else {
		bool status;
		dibujable = getDibujableParticular(accionesParticulares.at(estadoParticular), time, &status);
		if (!status) {
			estadoParticular = EstadoPrincesa::FinRescate;
		}
	}
	
	return dibujable;

}

void Princesa::addAccionParticular(int idImagen, int cuadros) {
	Animacion *animacion = new Animacion (cuadros, 0, idImagen, ancho, alto);
    accionesParticulares.push_back(animacion);
}

int Princesa::getEstadoParticular(){
	return estadoParticular;
}

void Princesa::Rescatar(Personaje* personaje) {

	if (personaje->getEstadoVida() == Muerto) return;
	if (Rescatada()) return;
	
	estadoParticular = EstadoPrincesa::Rescatando;
	salvador = personaje;
	personaje->setActivo(false);
}

bool Princesa::Rescatada() {
	return (estadoParticular == EstadoPrincesa::FinRescate);
}

Personaje* Princesa::getSalvador() {
	return salvador;
}

void Princesa::ColisionarConPersonaje(ObjetoEstatico* personaje, int colX, int colY, int colXvieja, int colYvieja){
	
	Personaje* per = dynamic_cast<Personaje*> (personaje);

	if (!per->getActivo()) return;

	per->StartSonido(SonidosPersonaje::RescatePrincesa);
	per->SumarPuntos(PUNTOS_SUMAR);
	Rescatar(static_cast<Personaje*>(personaje));
}

void Princesa::ColisionarConEnemigo(ObjetoEstatico* movible, int colX, int colY, int colXvieja, int colYvieja){
	//en principio no hace nada
}
